package priv.conceit.study.book.lambda.chapter5;

import priv.conceit.study.book.lambda.common.entity.Album;
import priv.conceit.study.book.lambda.common.entity.Artist;
import priv.conceit.study.book.lambda.common.entity.SampleData;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collector;
import java.util.stream.Collectors;

/**
 * 高级集合类 和 收集器
 * 5.3.6
 * 组合收集器
 *
 *
 *
 * @author Conceit
 * @since 1.0.0, 2021/10/1
 */
public class ComposingCollectors {

    public static void main(String[] args) {
        //findMainMusicianAlbumCounting();
        findMainMusicianAlbumName();

    }

    /**
     * 收集每个专辑的主唱 所对应的专辑个数
     * k为歌手名
     * v为对应的专辑个数
     */
    private static void findMainMusicianAlbumCounting(){
        Map<Artist,Long> map= SampleData.albumAllStream.collect(Collectors.groupingBy(album -> album.getMainMusician(),Collectors.counting()));
        map.forEach((k,v)->{
            System.out.println(k);
            System.out.println(v);
        });
    }

    /**
     * 收集每个专辑的主唱 所对应的专辑名
     * k为歌手名
     * v为对应的专辑名列表
     * mapping会一直累加
     * 用来收集最终结果的子集，这种收集器叫做下游收集器downstream
     * */
    private static void findMainMusicianAlbumName(){
        Map<Artist, List<String>> map= SampleData.albumAllStream.collect(Collectors.groupingBy(album -> album.getMainMusician(),Collectors.mapping(Album::getName, Collectors.toList())));
        map.forEach((k,v)->{
            System.out.println(k);
            v.stream().forEach(System.out::println);
        });
    }

}
